// 引入axios二次封装后的函数（获取购物车商品列表）
import { reqCartList, reqDeleteCart, reqUpdateChecked } from "@/api";

export default {
  actions: {
    // 获取购物车列表数据
    async getCartList ({ commit }) {
      const result = await reqCartList();
      // console.log(result);
      if (result.code >= 200 && result.code < 300) {
        commit('GETCARTLIST', result.data);
      }
    },

    // 删除购物车某个产品
    async deleteCart ({ commit }, skuId) {
      const result = await reqDeleteCart(skuId);
      if (result.code == 200) {
        // 删除成功，抛出成功信息
        return '删除商品成功!';
      } else {
        // 删除失败，抛出错误信息
        return Promise.reject(new Error('删除商品失败'));
      }
    },

    // 改变商品的选中状态
    async updateChecked ({ commit }, { skuId, isChecked }) {
      const result = await reqUpdateChecked(skuId, isChecked);
      if (result.code == 200) {
        return '状态改变成功';
      } else {
        return Promise.reject(new Error('删除商品失败'));
      }
    },

    // 删除所有选中商品
    deleteAllCheckedCart ({ dispatch, getters }) {
      let PromiseAll = [];
      // 获取购物车中所有的商品，并遍历找到被选中的商品
      getters.cartList.cartInfoList.forEach(item => {
        // 如果商品被选中，那么派发删除商品的action，并且添加到Promise.all中
        let promise = item.isChecked == 1 ? dispatch('deleteCart', item.skuId) : '';
        PromiseAll.push(promise);
      });
      // 如果都成功，返回成功，只要有一个失败，返回失败，并且失败的原理来自于其中的一个失败原因
      // console.log(PromiseAll);
      return Promise.all(PromiseAll);
    },

    // 商品全选/取消全选
    updateAllCartIsChecked ({ dispatch, getters }, isChecked) {
      // 遍历cartInfoList列表，并给其中的每一个元素派发改变状态的请求
      let PromiseAll = [];
      getters.cartList.cartInfoList.forEach(item => {
        item.isChecked = isChecked;
        let promise = dispatch('updateChecked', { skuId: item.skuId, isChecked: item.isChecked });
        PromiseAll.push(promise);
      });
      return Promise.all(PromiseAll)


    }
  },
  mutations: {
    GETCARTLIST (state, cartList) {
      state.cartList = cartList;
    }
  },
  state: {
    cartList: []
  },
  getters: {
    cartList (state) {
      return state.cartList[0] || {};
    }
  }
}
